package com.ungs.form;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

import com.ungs.bo.DireccionBO;
import com.ungs.bo.PersonaBO;
import com.ungs.bo.impl.DireccionBOImpl;
import com.ungs.bo.impl.PersonaBOImpl;
import com.ungs.entities.Cliente;
import com.ungs.entities.Direccion;
import com.ungs.entities.Persona;
import com.ungs.form.impl.ClienteFormImpl;
import com.ungs.utils.Constantes;
import com.ungs.utils.ValidacionCampo;

public class ModificarVerClienteForm extends JDialog {

	private static final long serialVersionUID = 1L;
	private final JPanel contentPanel = new JPanel();
	private JTextField txtRazonSocial;
	private JTextField txtCuit;
	private JTextField txtNombrePersona;
	private JTextField txtTelefonoPersona;
	private JTextField txtApellidoPersona;
	private JTextField txtMailPersona;
	private JTextField txtPais;
	private JTextField txtProvincia;
	private JTextField txtLocalidad;
	private JTextField txtCalle;
	private JTextField txtNumeroCalle;
	private JComboBox jcbCondicionIva;
	private JTextField txtTelefonoCliente;
	private JTextField txtMailCliente;
	private ClienteFormImpl clienteFormImpl;
	private Cliente cliente;

	public ModificarVerClienteForm(JDialog parent, Cliente cliente) {
		super(parent, true);
		this.cliente = cliente;
		setResizable(false);
		setTitle("Modificar Cliente");
		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		initForm();
		clienteFormImpl = new ClienteFormImpl();
		llenarCampos();
	}

	private void initForm() {
		setBounds(100, 100, 531, 503);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(null);

		JPanel panelCliente = new JPanel();
		panelCliente.setToolTipText("");
		panelCliente.setBorder(new TitledBorder(new LineBorder(new Color(0, 0,
				0)), "Cliente", TitledBorder.LEADING, TitledBorder.TOP, null,
				null));
		panelCliente.setBounds(10, 11, 502, 249);
		contentPanel.add(panelCliente);
		panelCliente.setLayout(null);

		JLabel lbRazonSocial = new JLabel("Raz\u00F3n Social:");
		lbRazonSocial.setBounds(10, 27, 64, 14);
		panelCliente.add(lbRazonSocial);

		JLabel lbCondicionIva = new JLabel("Cond. IVA:");
		lbCondicionIva.setBounds(10, 52, 54, 14);
		panelCliente.add(lbCondicionIva);

		JLabel lbCuit = new JLabel("CUIT:");
		lbCuit.setBounds(291, 27, 28, 14);
		panelCliente.add(lbCuit);

		txtRazonSocial = new JTextField();
		txtRazonSocial.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e,
						txtRazonSocial, 30);
			}
		});
		txtRazonSocial.setBounds(87, 24, 156, 20);
		panelCliente.add(txtRazonSocial);

		txtCuit = new JTextField();
		txtCuit.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.validarCuit(e, txtCuit);
				ValidacionCampo.verificarLargoCamposJTextField(e, txtCuit, 13);
			}
		});
		txtCuit.setBounds(329, 24, 140, 20);
		panelCliente.add(txtCuit);

		JPanel panelDireccion = new JPanel();
		panelDireccion.setBorder(new TitledBorder(new LineBorder(new Color(0,
				0, 0)), "Direcci\u00F3n:", TitledBorder.LEADING,
				TitledBorder.TOP, null, null));
		panelDireccion.setBounds(10, 110, 480, 130);

		panelCliente.add(panelDireccion);
		panelDireccion.setLayout(null);

		JLabel lbProvincia = new JLabel("Provincia:");
		lbProvincia.setBounds(254, 51, 60, 14);
		panelDireccion.add(lbProvincia);

		JLabel lbLocalidad = new JLabel("Localidad:");
		lbLocalidad.setBounds(10, 51, 60, 14);
		panelDireccion.add(lbLocalidad);

		JLabel lbNumeroCalle = new JLabel("N\u00FAmero:");
		lbNumeroCalle.setBounds(254, 22, 46, 14);
		panelDireccion.add(lbNumeroCalle);

		JLabel lbCalle = new JLabel("Calle:");
		lbCalle.setBounds(10, 22, 46, 14);
		panelDireccion.add(lbCalle);

		txtProvincia = new JTextField();
		txtProvincia.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent e) {
				eventoFocoGanadoProvinciaProveedor();
			}
		});
		txtProvincia.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e, txtProvincia,
						30);
			}
		});
		txtProvincia.setBounds(324, 48, 132, 20);
		panelDireccion.add(txtProvincia);

		txtLocalidad = new JTextField();
		txtLocalidad.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e, txtLocalidad,
						30);
			}
		});
		txtLocalidad.setBounds(71, 48, 158, 20);
		panelDireccion.add(txtLocalidad);

		txtCalle = new JTextField();
		txtCalle.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e, txtCalle, 30);
			}
		});
		txtCalle.setBounds(71, 19, 158, 20);
		panelDireccion.add(txtCalle);

		txtNumeroCalle = new JTextField();
		txtNumeroCalle.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarSoloNumeros(e);
				ValidacionCampo.verificarLargoCamposJTextField(e,
						txtNumeroCalle, 6);
			}
		});
		txtNumeroCalle.setBounds(321, 19, 84, 20);
		panelDireccion.add(txtNumeroCalle);

		txtPais = new JTextField();
		txtPais.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent e) {
				eventoFocoGanadoPaisProveedor();
			}
		});
		txtPais.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e, txtPais, 30);
			}
		});
		txtPais.setBounds(68, 76, 161, 20);
		panelDireccion.add(txtPais);

		JLabel lbPais = new JLabel("Pa\u00EDs:");
		lbPais.setBounds(10, 79, 32, 14);
		panelDireccion.add(lbPais);

		JLabel lblSiElCampo = new JLabel(
				"Si el campo calle esta vacio no se guarda la direccion.");
		lblSiElCampo.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblSiElCampo.setBounds(10, 107, 401, 14);
		panelDireccion.add(lblSiElCampo);

		jcbCondicionIva = new JComboBox();
		jcbCondicionIva.setModel(new DefaultComboBoxModel(new String[] {
				"EXENTO", "RESP. INSCRIPTO", "MONOTRIBUTO" }));
		jcbCondicionIva.setBounds(87, 48, 126, 22);
		panelCliente.add(jcbCondicionIva);

		JLabel lbAsterisco1 = new JLabel("*");
		lbAsterisco1.setFont(new Font("Tahoma", Font.BOLD, 11));
		lbAsterisco1.setBounds(248, 27, 21, 14);
		panelCliente.add(lbAsterisco1);

		JLabel lbAsterisco2 = new JLabel("*");
		lbAsterisco2.setFont(new Font("Tahoma", Font.BOLD, 11));
		lbAsterisco2.setBounds(479, 27, 11, 14);
		panelCliente.add(lbAsterisco2);

		txtTelefonoCliente = new JTextField();
		txtTelefonoCliente.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e,
						txtTelefonoCliente, 30);
			}
		});
		txtTelefonoCliente.setBounds(87, 79, 156, 20);
		panelCliente.add(txtTelefonoCliente);

		txtMailCliente = new JTextField();
		txtMailCliente.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e,
						txtMailCliente, 60);
			}
		});
		txtMailCliente.setBounds(329, 79, 161, 20);
		panelCliente.add(txtMailCliente);

		JLabel lbTelefonoCliente = new JLabel("Telefono");
		lbTelefonoCliente.setBounds(10, 82, 46, 14);
		panelCliente.add(lbTelefonoCliente);

		JLabel lbMailCliente = new JLabel("Mail:");
		lbMailCliente.setBounds(273, 82, 46, 14);
		panelCliente.add(lbMailCliente);

		JPanel panelPersonaContacto = new JPanel();
		panelPersonaContacto.setBorder(new TitledBorder(new LineBorder(
				new Color(0, 0, 0)), "Persona de Contacto",
				TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelPersonaContacto.setBounds(10, 271, 502, 119);

		contentPanel.add(panelPersonaContacto);
		panelPersonaContacto.setLayout(null);

		JLabel lbNombrePersona = new JLabel("Nombre:");
		lbNombrePersona.setBounds(17, 33, 46, 14);
		panelPersonaContacto.add(lbNombrePersona);

		JLabel lbTelefonoPersona = new JLabel("Tel\u00E9fono:");
		lbTelefonoPersona.setBounds(262, 58, 46, 14);
		panelPersonaContacto.add(lbTelefonoPersona);

		txtNombrePersona = new JTextField();
		txtNombrePersona.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e,
						txtNombrePersona, 30);
			}
		});
		txtNombrePersona.setBounds(66, 30, 134, 20);
		panelPersonaContacto.add(txtNombrePersona);

		txtTelefonoPersona = new JTextField();
		txtTelefonoPersona.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e,
						txtTelefonoPersona, 30);
			}
		});
		txtTelefonoPersona.setBounds(328, 55, 134, 20);
		panelPersonaContacto.add(txtTelefonoPersona);

		JLabel lbApellidoPersona = new JLabel("Apellido:");
		lbApellidoPersona.setBounds(262, 33, 46, 14);
		panelPersonaContacto.add(lbApellidoPersona);

		txtApellidoPersona = new JTextField();
		txtApellidoPersona.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e,
						txtApellidoPersona, 30);
			}
		});
		txtApellidoPersona.setBounds(328, 30, 134, 20);
		panelPersonaContacto.add(txtApellidoPersona);

		JLabel lbMail = new JLabel("Mail:");
		lbMail.setBounds(17, 61, 46, 14);
		panelPersonaContacto.add(lbMail);

		txtMailPersona = new JTextField();
		txtMailPersona.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e,
						txtMailPersona, 60);
			}
		});
		txtMailPersona.setBounds(66, 58, 186, 20);
		panelPersonaContacto.add(txtMailPersona);

		JLabel lblSiElCampo_1 = new JLabel(
				"Si el campo nombre esta vacion no se gurda la persona.");
		lblSiElCampo_1.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblSiElCampo_1.setBounds(10, 94, 401, 14);
		panelPersonaContacto.add(lblSiElCampo_1);

		JLabel lbCamposObligatorios = new JLabel(
				"Los campos con * son obligatorios");
		lbCamposObligatorios.setFont(new Font("Tahoma", Font.BOLD, 11));
		lbCamposObligatorios.setBounds(10, 420, 401, 14);
		contentPanel.add(lbCamposObligatorios);
		{
			JPanel buttonPane = new JPanel();
			buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
			{
				JButton okButton = new JButton("Guardar");
				okButton.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
					}
				});
				okButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						eventoBotonAceptar();
					}
				});

				buttonPane.add(okButton);
				getRootPane().setDefaultButton(okButton);
			}
			{
				JButton cancelButton = new JButton("Cancelar");
				cancelButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						eventoBotonCancelar();
					}
				});
				buttonPane.add(cancelButton);
			}
		}
	}

	private void eventoBotonAceptar() {
		boolean cuitCorrecto = false;
		if (txtCuit.getText().length() == 13) {
			cuitCorrecto = true;
		}
		if (!txtRazonSocial.getText().trim().isEmpty() && cuitCorrecto) {
			if (cliente.getDireccion() != null) {
				// Si tiene direccion
				if (!txtCalle.getText().trim().isEmpty()) {
					cliente.getDireccion().setCalle(
							txtCalle.getText().toUpperCase());
					cliente.getDireccion().setNumero(
							Integer.parseInt(txtNumeroCalle.getText()
									.toUpperCase()));
					cliente.getDireccion().setLocalidad(
							txtLocalidad.getText().toUpperCase());
					cliente.getDireccion().setProvincia(
							txtProvincia.getText().toUpperCase());
					cliente.getDireccion().setPais(
							txtPais.getText().toUpperCase());
				} else {
					// Si tiene direccion pero no hay nada en los campos
					DireccionBO direccionBO = new DireccionBOImpl();
					direccionBO.eliminarDireccion(cliente.getDireccion());
					cliente.setDireccion(null);
				}
			} else {
				// Si no tiene direccion
				if (!txtCalle.getText().trim().isEmpty()) {
					Direccion direccion = new Direccion();
					direccion.setCalle(txtCalle.getText().toUpperCase());
					direccion.setNumero(Integer.parseInt(txtNumeroCalle
							.getText().toUpperCase()));
					direccion
							.setLocalidad(txtLocalidad.getText().toUpperCase());
					direccion
							.setProvincia(txtProvincia.getText().toUpperCase());
					direccion.setPais(txtPais.getText().toUpperCase());
					cliente.setDireccion(direccion);
				}
			}

			if (cliente.getPersonaContacto() != null) {
				if (!txtNombrePersona.getText().trim().isEmpty()) {
					cliente.getPersonaContacto().setNombre(
							txtNombrePersona.getText().toUpperCase());
					cliente.getPersonaContacto().setApellido(
							txtApellidoPersona.getText().toUpperCase());
					cliente.getPersonaContacto().setTelefono(
							txtTelefonoPersona.getText().toUpperCase());
					cliente.getPersonaContacto().setMail(
							txtMailPersona.getText().toUpperCase());
				} else {
					PersonaBO personaBO = new PersonaBOImpl();
					personaBO.eliminarPersona(cliente.getPersonaContacto());
					cliente.setPersonaContacto(null);
				}
			} else {
				if (!txtNombrePersona.getText().trim().isEmpty()) {
					Persona persona = new Persona();
					persona.setNombre(txtNombrePersona.getText().toUpperCase());
					persona.setApellido(txtApellidoPersona.getText()
							.toUpperCase());
					persona.setMail(txtMailPersona.getText().toUpperCase());
					persona.setTelefono(txtTelefonoPersona.getText()
							.toUpperCase());
					cliente.setPersonaContacto(persona);
				}
			}

			cliente.setRazonSocial(txtRazonSocial.getText().toUpperCase());
			cliente.setCuit(txtCuit.getText());
			cliente.setCondicionIva((String) jcbCondicionIva.getSelectedItem());
			cliente.setTelefono(txtTelefonoCliente.getText());
			cliente.setMail(txtMailCliente.getText().toLowerCase());

			clienteFormImpl.modificarCliente(cliente);
			this.setVisible(true);
			this.dispose();
		} else {
			JOptionPane.showMessageDialog(this,
					"Complete los campos obligatorios:\nRazonSocial\nCUIT",
					"Campos Obligatorios", JOptionPane.WARNING_MESSAGE);
		}
	}

	private void llenarCampos() {
		txtRazonSocial.setText(cliente.getRazonSocial());
		txtCuit.setText(cliente.getCuit());
		jcbCondicionIva.setSelectedItem(cliente.getCondicionIva());
		txtTelefonoCliente.setText(cliente.getTelefono());
		txtMailCliente.setText(cliente.getMail());

		if (cliente.getDireccion() != null) {
			txtCalle.setText(cliente.getDireccion().getCalle());
			txtNumeroCalle.setText(String.valueOf(cliente.getDireccion()
					.getNumero()));
			txtLocalidad.setText(cliente.getDireccion().getLocalidad());
			txtProvincia.setText(cliente.getDireccion().getProvincia());
			txtPais.setText(cliente.getDireccion().getPais());
		}

		if (cliente.getPersonaContacto() != null) {
			txtNombrePersona.setText(cliente.getPersonaContacto().getNombre());
			txtApellidoPersona.setText(cliente.getPersonaContacto()
					.getApellido());
			txtMailPersona.setText(cliente.getPersonaContacto().getMail());
			txtTelefonoPersona.setText(cliente.getPersonaContacto()
					.getTelefono());
		}
	}

	private void eventoBotonCancelar() {
		this.setVisible(true);
		this.dispose();
	}

	private void eventoFocoGanadoProvinciaProveedor() {
		if (txtProvincia.getText().trim().isEmpty()
				&& !txtCalle.getText().trim().isEmpty()) {
			txtProvincia.setText(Constantes.PROVINCIA);
		}
		txtProvincia.selectAll();
	}

	private void eventoFocoGanadoPaisProveedor() {
		if (txtPais.getText().trim().isEmpty()
				&& !txtCalle.getText().trim().isEmpty()) {
			txtPais.setText(Constantes.PAIS);
		}
		txtPais.selectAll();
	}
}
